package com.cancer.common.util;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public final class EncryptUtil {
	private EncryptUtil() {
	}

	/** 信息摘要算法类型 **/
	public static enum MessageDigestType {
		MD5("MD5"), SHA1("SHA-1"), SHA256("SHA-256"), SHA512("SHA-512");

		private String name;

		private MessageDigestType(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}
	}

	/** 信息摘要算法类型 **/
	public static enum KeyGeneratorType {
		AES("AES");

		private String name;

		private KeyGeneratorType(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}
	}

	/**
	 * 将字符串数组转换成字节数组的list
	 *
	 * @autohr 刘俊
	 * @date 2016年1月7日
	 * @param contents
	 * @return
	 */
	private static byte[][] parseByteArr(String... contents) {
		byte[][] arr = new byte[contents.length][];

		for (int i = 0; i < contents.length; ++i) {
			String str = contents[i];
			arr[i] = str.getBytes();
		}

		return arr;
	}

	/**
	 * 根据信息摘要算法类型，获取其实例
	 *
	 * @autohr 刘俊
	 * @date 2016年1月8日
	 * @param type
	 * @return
	 */
	private static MessageDigest getInstance(MessageDigestType type) {
		MessageDigest digest = null;
		try {
			digest = MessageDigest.getInstance(type.getName());
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException(e);
		}

		return digest;
	}

	/**
	 * 根据信息摘要算法类型，获取其实例
	 *
	 * @autohr 刘俊
	 * @date 2016年1月8日
	 * @param type
	 * @return
	 */
//	private static KeyGenerator getInstance(KeyGeneratorType type) {
//		KeyGenerator generator = null;
//		try {
//			generator = KeyGenerator.getInstance(type.name);
//		} catch (NoSuchAlgorithmException e) {
//			throw new RuntimeException(e);
//		}
//
//		return generator;
//	}

	/**
	 * 计算string(s)的摘要值
	 *
	 * @autohr 刘俊
	 * @date 2016年1月8日
	 * @param md
	 *            摘要加密实例
	 * @param contents
	 *            原始数据
	 * @return
	 */
	private static byte[] digest(MessageDigest md, String... contents) {

		return digest(md, parseByteArr(contents));
	}

	/**
	 * 计算byte[](s)的摘要值，此方法用于计算文件的摘要值
	 *
	 * @autohr 刘俊
	 * @date 2016年1月8日
	 * @param md
	 *            摘要加密实例
	 * @param contents
	 *            原始数据
	 * @return
	 */
	private static byte[] digest(MessageDigest md, byte[]... contents) {
		// 指定要计算的内容
		for (byte[] con : contents) {
			md.update(con);
		}

		// 返回摘要值数组
		byte[] digestMsg = md.digest();

		return digestMsg;
	}

	/**
	 * 计算MD5摘要值
	 *
	 * @autohr 刘俊 2016年1月8日
	 * @param contents
	 *            原始数据
	 * @return 摘要值
	 */
	public static String md5(String... contents) {
		MessageDigest md = getInstance(MessageDigestType.MD5);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

	public static String md5(byte[]... contents) {
		MessageDigest md = getInstance(MessageDigestType.MD5);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

	public static String sha1(String... contents) {
		MessageDigest md = getInstance(MessageDigestType.SHA1);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

	public static String sha1(byte[]... contents) {
		MessageDigest md = getInstance(MessageDigestType.SHA1);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

	public static String sha256(String... contents) {
		MessageDigest md = getInstance(MessageDigestType.SHA256);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

	public static String sha256(byte[]... contents) {
		MessageDigest md = getInstance(MessageDigestType.SHA256);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

	public static String sha512(String... contents) {
		MessageDigest md = getInstance(MessageDigestType.SHA512);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

	public static String sha512(byte[]... contents) {
		MessageDigest md = getInstance(MessageDigestType.SHA512);

		return new BigInteger(1, digest(md, contents)).toString(16);
	}

//	/**
//	 * 对原始数据进行base64的加密
//	 * 
//	 * @autohr 刘俊
//	 * @date 2016年1月8日
//	 * @param content
//	 * @return
//	 */
//	public static String encodeBase64(String content) {
//		Encoder base64 = Base64.getEncoder();
//		byte[] bytes = base64.encode(content.getBytes());
//
//		return String.valueOf(bytes);
//	}
//
//	/**
//	 * 解密base64编码
//	 * 
//	 * @autohr 刘俊
//	 * @date 2016年1月8日
//	 * @param encodeStr
//	 * @return
//	 */
//	public static String decodeBase64(String encodeStr) {
//		Decoder base64 = Base64.getDecoder();
//		byte[] bytes = base64.decode(encodeStr.getBytes());
//
//		return String.valueOf(bytes);
//	}
}
